Python 在beautifulsoup中编写干净的代码

Python 在beautifulsoup中编写干净的代码,python,beautifulsoup,Python,Beautifulsoup,当解析网页上几乎没有语义结构的表时,我美丽的汤表达式变得非常难看。我可能走错了方向,我想知道如何重写代码,使其更可读、更不凌乱? 例如,在一个页面中有三个表。相关数据见第三个表。实际数据从第二行开始。行中的第一个条目是索引,我需要的数据在第二个td元素中。第二个td元素有两个链接,我感兴趣的文本位于第二个a标记内。把这个翻译成我写的beuatifulsoup soup.find_all('table')[2].find_all('tr')[2].find_all('td')[1].find_al

当解析网页上几乎没有语义结构的表时,我美丽的汤表达式变得非常难看。我可能走错了方向,我想知道如何重写代码,使其更可读、更不凌乱?

例如,在一个页面中有三个表。相关数据见第三个表。实际数据从第二行开始。行中的第一个条目是索引,我需要的数据在第二个
td
元素中。第二个
td
元素有两个链接,我感兴趣的文本位于第二个a标记内。把这个翻译成我写的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:]]
这种代码可以吗,或者还有改进的余地吗?

使用,您可以使用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()'))

lxml看起来比bs4干净得多。谢谢,我想我会切换。看看,它会让你使用CSS样式选择器,并真正简化你的代码。
['blah1-1', 'blah2-1', 'blah3-1', 'blah4-1', 'blah5-1']