网站抓取

时间:2017-08-23 01:24:33

标签: python web-scraping lxml

我正在尝试从这个HTML代码中删除一些数据。更准确地说我想获得所有数字(这里:[401969217,401969218])。当然,html网站更长,存在更多数字。

<p class="price asking help ">
                <span class="title">Asking Price:</span><b>$349,900<span class="help" title="The total asking price of the business for sale."><i class="fa fa-question-circle"></i></span></b>
            </p>

我能够通过以下方法抓住所有球队:

<td class="nw">1. FC Köln</td>
<td class="nw">Hamburger SV</td>
<td class="nw">3 - 7 - 10</td>
<td class="kicktipp-tippabgabe ">
  <input name="spieltippForms[401969217].tippAbgegeben" id="spieltippForms_401969217_tippAbgegeben" value="true" type="hidden"/>
  <input id="spieltippForms_401969217_heimTipp" name="spieltippForms[401969217].heimTipp" type="tel" value="2" size="2" maxlength="3"/>:
  <input id="spieltippForms_401969217_gastTipp" name="spieltippForms[401969217].gastTipp" type="tel" value="2" size="2" maxlength="3"/>
</td>
</tr>
<tr>
  <td class="nw kicktipp-time">26.08.17 15:30</td>
  <td class="nw">Bayer 04 Leverkusen</td>
  <td class="nw">1899 Hoffenheim</td>
  <td class="nw">6 - 3 - 10</td>
  <td class="kicktipp-tippabgabe ">
    <input name="spieltippForms[401969218].tippAbgegeben" id="spieltippForms_401969218_tippAbgegeben" value="true" type="hidden"/>
    <input id="spieltippForms_401969218_heimTipp" name="spieltippForms[401969218].heimTipp" type="tel" value="2" size="2" maxlength="3"/>:
    <input id="spieltippForms_401969218_gastTipp" name="spieltippForms[401969218].gastTipp" type="tel" value="2" size="2" maxlength="3"/>
  </td>
</tr>
<tr>
  <td class="nw kicktipp-time"/>
  ...

不幸的是,我不知道如何修改它以解决我的新问题。希望你能帮忙:)

2 个答案:

答案 0 :(得分:2)

在您的xpath表达式中,您不希望'//td[@class="nw"]/text()',因为它会获取标记之间的值class="nw"作为属性。相反,根据您提供的html和所需的输出,您应该尝试抓取name标记的input属性并解析该值。

from lxml import html
import re

h = html.fromstring('''<table><tr><td class="kicktipp-tippabgabe ">
  <input name="spieltippForms[401969217].tippAbgegeben" id="spieltippForms_401969217_tippAbgegeben" value="true" type="hidden"/>
  <input id="spieltippForms_401969217_heimTipp" name="spieltippForms[401969217].heimTipp" type="tel" value="2" size="2" maxlength="3"/>:
  <input id="spieltippForms_401969217_gastTipp" name="spieltippForms[401969217].gastTipp" type="tel" value="2" size="2" maxlength="3"/>
</td>
</tr>
<tr>
  <td class="nw kicktipp-time">26.08.17 15:30</td>
  <td class="nw">Bayer 04 Leverkusen</td>
  <td class="nw">1899 Hoffenheim</td>
  <td class="nw">6 - 3 - 10</td>
  <td class="kicktipp-tippabgabe ">
    <input name="spieltippForms[401969218].tippAbgegeben" id="spieltippForms_401969218_tippAbgegeben" value="true" type="hidden"/>
    <input id="spieltippForms_401969218_heimTipp" name="spieltippForms[401969218].heimTipp" type="tel" value="2" size="2" maxlength="3"/>:
    <input id="spieltippForms_401969218_gastTipp" name="spieltippForms[401969218].gastTipp" type="tel" value="2" size="2" maxlength="3"/>
  </td>
</tr>
</table>''')

numbers = [int(x) for e in h.xpath('//input[@type="hidden"]') 
              for x in re.findall(r'\[(\d+)\]', e.get('name'))]

numbers
# returns:
[401969217, 401969218]

答案 1 :(得分:1)

使用其中的数字获取id s的另一种方法是使用这样的代码。

>>> from lxml import html
>>> tree = html.parse('table.htm')
>>> tree.xpath('.//input[contains(@id,"_heimTipp")]/@id')
['spieltippForms_401969217_heimTipp', 'spieltippForms_401969218_heimTipp']

我不知道在id的值中可以找到哪种变化,因此要说明如何处理它们并不容易。但它可能很简单,

>>> ids = tree.xpath('.//input[contains(@id,"_heimTipp")]/@id')
>>> numbers = [int(id.split('_')[1]) for id in ids]
>>> numbers
[401969217, 401969218]