Python 3 Beautiful Soup 用冒号查找标签
Posted
技术标签:
【中文标题】Python 3 Beautiful Soup 用冒号查找标签【英文标题】:Python 3 Beautiful Soup find tag with colon 【发布时间】:2017-02-17 11:02:38 【问题描述】:我正在尝试抓取该站点并获取两个单独的标签。这就是 html 的样子。
<url>
<loc>
http://link.com
</loc>
<lastmod>date</lastmode>
<changefreq>daily</changefreq>
<image:image>
<image:loc>
https://imagelink.com
<image:loc>
<image:title>Item title</image:title>
<image:image>
</url>
我想要获取的标签是 loc 和 image:title。我遇到的问题是标题标签中的冒号。我到目前为止的代码是
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
for item in soup.find_all('url'):
print(item.loc)
#print image title
我也尝试过这样做
print(item.title)
但这不起作用
【问题讨论】:
那是 xml 而不是 html 和一个附加了命名空间的节点而不是两个。你从哪里弄来的? 【参考方案1】:您应该改为在"xml" mode 中解析它(还需要安装lxml
):
from bs4 import BeautifulSoup
data = """
<url>
<loc>
http://link.com
</loc>
<lastmod>date</lastmod>
<changefreq>daily</changefreq>
<image:image>
<image:loc>
https://imagelink.com
</image:loc>
<image:title>Item title</image:title>
</image:image>
</url>"""
soup = BeautifulSoup(data, 'xml')
for item in soup.find_all('url'):
print(item.title.get_text())
打印Item title
。
请注意,我已经对您的 XML 字符串进行了一些修复,因为它最初格式不正确。
【讨论】:
【参考方案2】:我正在用 BeautifulSoup 解析 Confluence XHTML,而 alecxe 的解决方案并没有让我满意,因为我真的需要 BeautifulSoup 的 html
模式。
所以我找到了一个使用正则表达式的 hacky 解决方案:
>>> import re
>>> from bs4 import BeautifulSoup
>>>
>>> data = """
... <url>
... <loc>
... http://link.com
... </loc>
... <lastmod>date</lastmod>
... <changefreq>daily</changefreq>
... <image:image>
... <image:loc>
... https://imagelink.com
... </image:loc>
... <image:title>Item title</image:title>
... </image:image>
... </url>"""
>>>
>>> soup = BeautifulSoup(data, 'html.parser')
>>> soup.find_all('image:title') # nope, bs4 won't allow us to do this
[]
>>> soup.find_all(re.compile('image:title')) # but this works
[<image:title>Item title</image:title>]
【讨论】:
以上是关于Python 3 Beautiful Soup 用冒号查找标签的主要内容,如果未能解决你的问题,请参考以下文章