lxml不允许我收集html文档中超链接标记之间的文本



EDIT:我注意到我要查找的文本实际上是在页面其余部分完成加载后的一两分钟加载的。我发现我可以收集所有我想要的信息,除了这个和另一个标签,它也被延迟加载。我真的不知道是什么导致了延迟,于是网站上添加了一个新功能,让我可以在报告中获得我要删除的信息。我不再寻求解决这个奇怪的情况,因为我有我需要的,但不想删除这个问题

马里兰州。Mohsin的答案适用于更正常的情况,所以我把他的答案标记为正确的,因为它回答了实际提出的问题,而不是我的具体情况,我没有正确理解或表达/编辑

我正在尝试获取显示在超链接标记之间的文本。在这种特殊情况下的电子邮件地址。

例如:

<tr>
    <td class="txtXSmall" align="right">Name: </td>
    <td id="showContactName" class="txtSmall" align="left">John Snow</td>
</tr>
<tr>
    <td class="txtXSmall" align="right">Email: </td>
    <td class="txtSmall" align="left">
        <a id="contactEmail" href="#">I WANT THIS RIGHT HERE</a>
    </td>
</tr>

我通过请求获取页面,然后使用lxml中的html对其进行解析

def GetOrderData(orderID):
    ## password
    payload = {'pass': 'password', 'user': 'user','submit':'go'}  ## Log in Paramaters
    ## page
    r = requests.get("http://website.com/order.php?orderID="+str(orderID), params=payload) ##Get Order Page
    ## html analyzed
    tree = html.fromstring(r.text)  ## turn raw string into html tagged data
    return tree 

我尝试过以下几种:

使用尽可能具体的xpath

>>>rawdata = tree.xpath("/html/body/form[1]/table[1]/tbody/tr[1]/td[3]/div[1]/section/table/tbody/tr/td[1]/table/tbody/tr/td/div[1]/table/tbody/tr[3]/td[2]/a")
>>>print rawdata
[]

正在查找此链接所属的文本块。

>>>rawdata = tree.xpath(".//*[@id='show_contact']")
>>>print rawdata[0].text_content()
prints the whole grouped block of text that is outside of the <a> tag

去它的特定ID

>>>rawdata = tree.xpath(".//*[@id='contactEmail']")
>>>rawdata[0].text_content()
''
>>>rawdata[0].text

我尝试过其他一些没有很好记录的事情,但都无济于事。

lxml能够实现我的目标吗?

如果没有,我是否可以使用其他库?

作为最后的希望,有没有一种方法可以跟随带有lxml或请求的链接?

虽然链接有"href="#"',但它会把我带到这里:

https://mail.google.com/mail/stuff/mailto:EMAIL ADDRESS THAT I WANT?stuff

如果我能激活该链接,然后捕获它所指向的页面的url,我可能就能获得我想要的文本。

谢谢。

**编辑**

以下是对html 的更广泛了解

<div class="ui-box">
  <header>
    <section>
      <table cellspacing="0" cellpadding="0" border="0" width="100%">
        <tbody>
          <tr>
            <td width="99%" valign="top">
              <table cellspacing="0" cellpadding="4" border="0">
                <tbody>
                  <tr>
                    <td width="100%">
                      <div id="show_contact">
                        <table class="txtGray" cellspacing="0" cellpadding="2" border="0" width="100%">
                        <tbody>
                          <tr>
                          <tr>
                          <tr>
                            <td class="txtXSmall" align="right">Email: </td>
                            <td class="txtSmall" align="left">
                              <a id="contactEmail" href="#">I WANT TO CAPTURE THIS</a>
                            </td>
                         </tr>
                         <tr>
                         <tr>
                       </tbody>
                     </table>
                   </div>
                 <div id="edit_contact" style="display: none;">
               </td>
             </tr>
           </tbody>
         </table>
       </td>
       <td align="right" width="1%" valign="top">
       </tr>
     </tbody>
   </table>
</section>
</div>

我使用了您的宽外观html来代替r.text

import lxml.html
tree = lxml.html.fromstring(r.text)
print tree.xpath('//*[@id="contactEmail"]//text()')

Out[]: ['I WANT TO CAPTURE THIS']

希望能有所帮助:-)

最新更新