用Python从解析的HTML中提取文本
我刚开始学习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]