使用具有相同类名的Selenium问题进行网络抓取

时间:2019-04-21 20:16:58

标签: python selenium web-scraping

我使用Selenium从一个简单的动态表中提取了一些足球数据,但是问题是,当我试图获取“文本中心”类名称时,它显示了许多我不想要的额外数据。

我尝试使用xpath和css_selector,但不能解决问题。

站点HTML:

数据1:得分(想要的结果为0-0)

<td class="text-center">
   <a href="/r/1571269/somedata" id="r_1571269S">0-0</a>
   </td>

数据2:奇数:(想要的数据:2.375)

<td class="text-center" id="o_1562530_0">2.375</td>

这是我的代码的一部分:


Score = driver.find_element_by_class_name('text-center')
for score in Score:

    print("Score: "+ score.text)


如您所见,它们具有相同的类名,并且当我运行脚本时,它既显示了Togheter,又带有该类名的许多其他内容。 我也尝试通过ID查找,但是ID每次都会更改,因此没有任何意义。 你有什么建议吗?提前谢谢。

2 个答案:

答案 0 :(得分:1)

这个问题真的不清楚...但是... 如果您有多个具有相同CSS类名称的元素,则可以在每个元素中找到这样的文本:

elements = driver.find_elements_by_class_name('text-center')
for element in elements:
    print(element.text)
  • 注意使用find_elements_*而不是find_element_* ...复数形式返回所有匹配元素的列表。

答案 1 :(得分:0)

看一下样本,一组数据在td>一个元素(分数)中,而另一组数据在td 没有 a中。这可以通过xpath轻松实现:

all_scores = driver.find_elements_by_xpath('//td[@class="text-center"]/a')
all_odds = driver.find_elements_by_xpath('//td[@class="text-center" and not(a)]')   # all td elements with that class, and not having a child named "a"

该类值的确看起来太通用了-我想会有很多元素居中显示文本。
现在,看一下HTML摘录-不要放置代码的屏幕截图,请花时间复制和粘贴它们-这些td是table元素的一部分,其ID看起来不像自动生成的ID 。因此,我将锚定元素-这些td位于表树中;例如:

//table[@id="thl_inplay"]//td[@class="text-center"]/a
//table[@id="thl_inplay"]//td[@class="text-center" and not(a)]

最后,这是一张表,您想要的值可能总是在同一列中;如果将此条件添加到xpath条件中,则可以确保定位到正确的条件。说分数是4,奇数是6:

//table[@id="thl_inplay"]//td[@class="text-center" and position()=4]/a
//table[@id="thl_inplay"]//td[@class="text-center" and not(a) and position()=6]