在网页上解析一个语义结构很少的表时,我美丽的汤表达式变得非常难看。我可能会采用错误的方式,并且想知道如何重写我的代码以使其更具可读性和更少杂乱?
例如,在页面中有三个表。相关数据在第三个表中。实际数据从第二行开始。该行中的第一个条目是索引,我需要的数据位于第二个td
元素中。第二个td
元素有两个链接,我感兴趣的文本在第二个标记内。把它翻译成beuatifulsoup我写了
soup.find_all('table')[2].find_all('tr')[2].find_all('td')[1].find_all('a')[1].text
工作正常,我在列表理解中使用相同的原理抓取表中的所有70个元素。
relevant_data = [ x.find_all('td')[1].find_all('a')[1].text for x in soup.find_all('table')[2].find_all('tr')[2:]]
这种代码是好的还是有改进的余地?
答案 0 :(得分:3)
使用lxml
,您可以使用XPath。
例如:
html = '''
<body>
<table></table>
<table></table>
<table>
<tr></tr>
<tr></tr>
<tr><td></td><td><a>blah1</a><a>blah1-1</a></td></tr>
<tr><td></td><td><a>blah2</a><a>blah2-1</a></td></tr>
<tr><td></td><td><a>blah3</a><a>blah3-1</a></td></tr>
<tr><td></td><td><a>blah4</a><a>blah4-1</a></td></tr>
<tr><td></td><td><a>blah5</a><a>blah5-1</a></td></tr>
</table>
<table></table>
</body>
'''
import lxml.html
root = lxml.html.fromstring(html)
print(root.xpath('.//table[3]/tr[position()>=2]/td[2]/a[2]/text()'))
输出:
['blah1-1', 'blah2-1', 'blah3-1', 'blah4-1', 'blah5-1']