用Python从解析的HTML中提取文本

2 投票
2 回答
848 浏览
提问于 2025-04-16 03: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>

补充一下,我想说的是,我是想用BeautifulSoup的功能在解析树中提取"/torrent/32726/0/"和"Slackware Linux 13.0 [x86 DVD ISO]"。我在搜索和阅读文档后尝试了各种方法,但还是不太确定该怎么做。

2 个回答

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 都会变成绝对链接,这样使用起来非常方便)。

3

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]  

撰写回答