我是编码的初学者,我的一个朋友告诉我使用BeautifulSoup而不是htmlparser。遇到一些问题后,我得到了一个使用lxml而不是BeaytifulSoup的提示,因为它好了10倍。
我希望有人能给我一个提示如何刮掉我正在寻找的文字。
我想要的是找到一个包含以下行和数据的表:
<tr>
<td><a href="website1.com">website1</a></td>
<td>info1</td>
<td>info2</td>
<td><a href="spam1.com">spam1</a></td>
</tr>
<tr>
<td><a href="website2.com">website2</a></td>
<td>info1</td>
<td>info2</td>
<td><a href="spam2.com">spam2</a></td>
</tr>
如何使用lxml
抓取信息1和2,没有垃圾邮件,并获得以下结果?
[['url' 'info1', 'info2'], ['url', 'info1', 'info2']]
答案 0 :(得分:4)
我使用 xpath :td/a[not(contains(.,"spam"))]/@href | td[not(a)]/text()
$ python3
>>> import lxml.html
>>> doc = lxml.html.parse('data.xml')
>>> [[j for j in i.xpath('td/a[not(contains(.,"spam"))]/@href | td[not(a)]/text()')] for i in doc.xpath('//tr')]
[['website1.com', 'info1', 'info2'], ['website2.com', 'info1', 'info2']]
答案 1 :(得分:4)
import lxml.html as lh
tree = lh.fromstring(your_html)
result = []
for row in tree.xpath("tr"):
url, info1, info2 = row.xpath("td")[:3]
result.append([url.xpath("a")[0].attrib['href'],
info1.text_content(),
info2.text_content()])
<强>结果:强>
[['website1.com', 'info1', 'info2'], ['website2.com', 'info1', 'info2']]
答案 2 :(得分:1)
import lxml.html as LH
doc = LH.fromstring(content)
print([tr.xpath('td[1]/a/@href | td[position()=2 or position()=3]/text()')
for tr in doc.xpath('//tr')])
long XPath具有以下含义:
td[1] find the first <td>
/a find the <a>
/@href return its href attribute value
| or
td[position()=2 or position()=3] find the second or third <td>
/text() return its text value