我的网络刮刀搜索返回不同数量的表格,我不习惯处理表格。这些表各3列。我检查第一列中的街道号码是否正确。如果是,那么我需要从该行的第三列中获取链接。有什么想法吗?我的代码显然不起作用,但应该知道我正在尝试做什么。我的代码目前不是逐行处理数据,只是td由td。
处理我的理想代码是什么样的:
抓住第一个表格行
检查第一列中的街道#是否匹配
如果#匹配,请抓住第三列中的链接
如果#不匹配,请转到检查下一个表格行
我仍然非常喜欢编程,因此我的代码仍处于笨拙的简单(但写得不好)的一面。
HTML问题
<tr>
<td class="transactionTableBodyText">5250 S RAINBOW BLVD 1001 </td>
<td class="transactionTableBodyText" align="center">SPRING VALLEY</td>
<td class="transactionTableBodyText" align="center">
<a id="DataGrid1__ctl3_HyperLink2" href="http://Sandgate.co.clark.nv.us/AssrRealProp/ParcelDetail.aspx?hdnParcel=16326214001&hdnInstance=pcl7" target="_self">163-26-214-001</a>
</td>
</tr>
我的Pythonic Selenium代码。
td = driver.find_elements_by_css_selector("td.transactionTableBodyText")
i = 0
while i <= len(td):
try:
if StrtNum in td[i].text:
print("We matched %s!" % (StrtNum))
#This is the incorrect part where I try to get to the 'a' selector in the 3rd column from the correctly identified 1st column.
ParcelLink = td[i+2].driver.find_elements_by_css_selector('a').get_attribute('href')
print(ParcelLink)
else:
return
except:
break
i+=1
答案 0 :(得分:1)
你的弓的另一个字符串: lxml 。它使您可以访问xpath表达式,这可以简化导航HTML的工作。
>>> from lxml import etree
>>> parser = etree.HTMLParser()
>>> tree = etree.fromstring(open('sample.htm').read(), parser)
>>> for td in tree.xpath('.//table/tr/td[@class="transactionTableBodyText"][1]'):
... if td.text.startswith('5250'):
... tr = td.getparent()
... td_3_link = tr.xpath('./td[3]/a')
... link = td_3_link[0].attrib['href']
...
>>> link
'http://Sandgate.co.clark.nv.us/AssrRealProp/ParcelDetail.aspx?hdnParcel=16326214001&hdnInstance=pcl7'
正如你所看到的,我使用了一个REPL环境,这样我就可以尝试各种方法,因为我试图收集一些运行良好并且看起来相当稳健的东西。
几乎忘了,这是我正在解析的HTML。
<table>
<tr>
<td class="transactionTableBodyText">1000 S RAINBOW BLVD 1001 </td>
<td class="transactionTableBodyText" align="center">SPRING VALLEY</td>
<td class="transactionTableBodyText" align="center">
<a id="DataGrid1__ctl3_HyperLink2" href="http://Sandgate.co.clark.nv.us/AssrRealProp/ParcelDetail.aspx?hdnParcel=16326214001&hdnInstance=pcl7" target="_self">163-26-214-001</a>
</td>
</tr>
<tr>
<td class="transactionTableBodyText">5250 S RAINBOW BLVD 1001 </td>
<td class="transactionTableBodyText" align="center">SPRING VALLEY</td>
<td class="transactionTableBodyText" align="center">
<a id="DataGrid1__ctl3_HyperLink2" href="http://Sandgate.co.clark.nv.us/AssrRealProp/ParcelDetail.aspx?hdnParcel=16326214001&hdnInstance=pcl7" target="_self">163-26-214-001</a>
</td>
</tr>
<tr>
<td class="transactionTableBodyText">2000 S RAINBOW BLVD 1001 </td>
<td class="transactionTableBodyText" align="center">SPRING VALLEY</td>
<td class="transactionTableBodyText" align="center">
<a id="DataGrid1__ctl3_HyperLink2" href="http://Sandgate.co.clark.nv.us/AssrRealProp/ParcelDetail.aspx?hdnParcel=16326214001&hdnInstance=pcl7" target="_self">163-26-214-001</a>
</td>
</tr>
<tr>
<td class="transactionTableBodyText">2000 S RAINBOW BLVD 1001 </td>
<td class="transactionTableBodyText" align="center">SPRING VALLEY</td>
<td class="transactionTableBodyText" align="center">
<a id="DataGrid1__ctl3_HyperLink2" href="http://Sandgate.co.clark.nv.us/AssrRealProp/ParcelDetail.aspx?hdnParcel=16326214001&hdnInstance=pcl7" target="_self">163-26-214-001</a>
</td>
</tr>
</table>'''