【问题标题】:Python 3 Beautiful Soup find tag with colonPython 3 Beautiful Soup 用冒号查找标签
【发布时间】: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 和一个附加了命名空间的节点而不是两个。你从哪里弄来的?

标签: python python-3.x tags beautifulsoup bs4


【解决方案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>]
    

    【讨论】:

      猜你喜欢
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      • 2012-08-09
      相关资源
      最近更新 更多