【问题标题】:Extracting Text from Parsed HTML with Python使用 Python 从解析的 HTML 中提取文本
【发布时间】:2011-04-04 06:32:19
【问题描述】:

我是 Python 新手,我一直在尝试使用已用 BeautifulSoup 解析的正则表达式搜索 html。我没有取得任何成功,我认为原因是我不完全了解如何正确设置正则表达式。我看过关于类似问题的旧问题,但我仍然没有弄清楚。如果有人可以提取“/torrent/32726/0/”和“Slackware Linux 13.0 [x86 DVD ISO]”以及正则表达式如何工作的详细表达,那将非常有帮助。

<td class="name">
  <a href="/torrent/32726/0/">
   Slackware Linux 13.0 [x86 DVD ISO]
  </a>
 </td>

编辑:我的意思是,我正在尝试使用 BeautifulSoups 函数提取“/torrent/32726/0/”和“Slackware Linux 13.0 [x86 DVD ISO]”来搜索解析树。在搜索和阅读文档后,我一直在尝试各种事情,但我仍然不确定如何去做。

【问题讨论】:

  • 现在他们使用解析器并且仍然想使用正则表达式o.O 你想要什么,提取带有以/torrent/ 开头的href 的锚的内容?您必须遍历解析树。您可以使用正则表达式来判断当前节点是否是您想要的,但您必须遍历解析器构建的树。
  • 我想我使用了错误的术语。你是对的,我想把 BeautifulSoup 生成的那个解析树,我想提取“/torrent/32726/0/”和“Slackware Linux 13.0 [x86 DVD ISO]”并将它们存储在他们自己的字典中。跨度>

标签: python html regex


【解决方案1】:

BeautifulSoup 还可以从您的 html 中提取节点值。

from BeautifulSoup import BeautifulSoup

html = ('<html><head><title>Page title</title></head>'
       '<body>'
       '<table><tr>'
       '<td class="name"><a href="/torrent/32726/0/">Slackware Linux 13.0 [x86 DVD ISO]</a></td>'
       '<td class="name"><a href="/torrent/32727/0/">Slackware Linux 14.0 [x86 DVD ISO]</a></td>'
       '<td class="name"><a href="/torrent/32728/0/">Slackware Linux 15.0 [x86 DVD ISO]</a></td>'
       '</tr></table>'
       'body'
       '</html>')
soup = BeautifulSoup(html)
links = [td.find('a') for td in soup.findAll('td', { "class" : "name" })]
for link in links:
    print link.string

输出:

Slackware Linux 13.0 [x86 DVD ISO]  
Slackware Linux 14.0 [x86 DVD ISO]  
Slackware Linux 15.0 [x86 DVD ISO]  

【讨论】:

  • 嘿,你从未使用过 re 模块 ¬¬
【解决方案2】:

你可以使用lxml.html来解析html文档:

from lxml import html

doc = html.parse('http://example.com')

for a in doc.cssselect('td a'):
    print a.get('href')
    print a.text_content()

您将不得不查看文档的结构,以找到确定所需链接的最佳方法(可能还有其他表格,其中包含您不需要的链接等...):您可能首先想要例如,找到正确的 table 元素。除了 css 选择器(例如 xpath)之外,还有其他选项可以搜索文档/元素。

如果需要,可以用.make_links_absolute()方法将链接转为绝对链接(解析后在文档上做,所有的url都是绝对的,很方便)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    相关资源
    最近更新 更多