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&amp;mid=shm&amp;sid1=100&amp;oid=421&amp;aid=0004679941">text1</a>
<a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://news.naver.com/main/read.nhn?mode=LSD&amp;mid=shm&amp;sid1=100&amp;oid=032&amp;aid=0003013328">text2</a>
<a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://news.naver.com/main/read.nhn?mode=LSD&amp;mid=shm&amp;sid1=100&amp;oid=052&amp;aid=0001449034">text3</a>
<a class="cluster_text_headline nclicks(cls_pol.clsart)" href="https://news.naver.com/main/read.nhn?mode=LSD&amp;mid=shm&amp;sid1=100&amp;oid=055&amp;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&amp;mid=shm&amp;sid1=100&amp;oid=032&amp;aid=0003013328'(代码中的第二个link)时,返回None。如果有人能解释为什么结果会因 URL.

而不同,我们将不胜感激。

这是由 bs4 使用的 html 解析器和您的 hrefs 中的 &amp; 引起的:当它解析您的 html 源代码时,

soup = BeautifulSoup(html, 'html.parser')

它转义 &amp;,将 &amp; 转换为 &。 (参见: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&amp;mid=shm&amp;sid1=100&amp;oid=032&amp;aid=0003013328')

所以它最终会尝试匹配您的(转义的)href 值 https://news.naver.com/main/read.nhn?mode=LSD&amp;mid=shm&amp;sid1=100&amp;oid=032&amp;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&amp;mid=shm&amp;sid1=100&amp;oid=032&amp;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)