BeautifulSoup - 查找具有特定属性值的标签效果不佳
BeautifulSoup - finding a tag with a certain attribute value doesn't work well
我是 python 爬行的新手。我玩了 find(tag, attribute = 'value')
并发现了一些有趣的结果。
代码如下:
from bs4 import BeautifulSoup
html = '''
<a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=421&aid=0004679941">text1</a>
<a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=032&aid=0003013328">text2</a>
<a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=052&aid=0001449034">text3</a>
<a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=055&aid=0000819508">text4</a>
<a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://www.test.com">text5</a>
'''
soup = BeautifulSoup(html, 'html.parser')
a_tags = soup.find('a', href="https://www.test.com")
print(a_tags)
这 returns <a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://www.test.com">text5</a>
符合预期。
但是当我将.find()
中的属性值替换成'https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=032&aid=0003013328'
(代码中的第二个link)时,返回None
。如果有人能解释为什么结果会因 URL.
而不同,我们将不胜感激。
这是由 bs4 使用的 html 解析器和您的 hrefs 中的 &
引起的:当它解析您的 html 源代码时,
soup = BeautifulSoup(html, 'html.parser')
它转义 &
,将 &
转换为 &
。 (参见:https://github.com/python/cpython/blob/a5d6aba318ead9cc756ba750a70da41f5def3f8f/Lib/html/parser.py#L326)。
它显然 不会 对您传递给 find
的 href 值进行相同的转换
a_tags = soup.find('a', href='https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=032&aid=0003013328')
所以它最终会尝试匹配您的(转义的)href 值
https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=032&aid=0003013328
针对您源代码中的 unescaped href 属性
<a href="https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=032&aid=0003013328">text2</a>
...失败了。另一方面,returns "expected" 结果:
html = '''
<a href="https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=032&aid=0003013328">text2</a>
<a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://www.test.com">text5</a>
'''
if __name__ == "__main__":
soup = BeautifulSoup(html, 'html.parser')
a_tags = soup.find('a', href='https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=032&aid=0003013328')
print(a_tags)
a_tags = soup.find('a', href='https://www.test.com')
print(a_tags)
我是 python 爬行的新手。我玩了 find(tag, attribute = 'value')
并发现了一些有趣的结果。
代码如下:
from bs4 import BeautifulSoup
html = '''
<a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=421&aid=0004679941">text1</a>
<a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=032&aid=0003013328">text2</a>
<a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=052&aid=0001449034">text3</a>
<a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=055&aid=0000819508">text4</a>
<a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://www.test.com">text5</a>
'''
soup = BeautifulSoup(html, 'html.parser')
a_tags = soup.find('a', href="https://www.test.com")
print(a_tags)
这 returns <a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://www.test.com">text5</a>
符合预期。
但是当我将.find()
中的属性值替换成'https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=032&aid=0003013328'
(代码中的第二个link)时,返回None
。如果有人能解释为什么结果会因 URL.
这是由 bs4 使用的 html 解析器和您的 hrefs 中的 &
引起的:当它解析您的 html 源代码时,
soup = BeautifulSoup(html, 'html.parser')
它转义 &
,将 &
转换为 &
。 (参见:https://github.com/python/cpython/blob/a5d6aba318ead9cc756ba750a70da41f5def3f8f/Lib/html/parser.py#L326)。
它显然 不会 对您传递给 find
a_tags = soup.find('a', href='https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=032&aid=0003013328')
所以它最终会尝试匹配您的(转义的)href 值
https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=032&aid=0003013328
针对您源代码中的 unescaped href 属性
<a href="https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=032&aid=0003013328">text2</a>
...失败了。另一方面,returns "expected" 结果:
html = '''
<a href="https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=032&aid=0003013328">text2</a>
<a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://www.test.com">text5</a>
'''
if __name__ == "__main__":
soup = BeautifulSoup(html, 'html.parser')
a_tags = soup.find('a', href='https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=032&aid=0003013328')
print(a_tags)
a_tags = soup.find('a', href='https://www.test.com')
print(a_tags)