【问题标题】:How to parse the text from an anchor tag?如何解析锚标签中的文本?
【发布时间】:2017-08-28 17:17:08
【问题描述】:

我想解析这个“<a href="javascript:8==99999?popDuelloDialog(2754288):popTeam(2386)">Gnistan</a>”并提取文本。

我试图提取很多,但我无法成功。

我不知道如何使用这种不重复的“javascript 来”:(numbers)”格式构建方法。所以我需要这样一种方法,它只使用重复部分并提取正文中的文本。

我的代码在这里:

import sys
from PyQt4.QtGui import QApplication
from PyQt4.QtCore import QUrl
from PyQt4.QtWebKit import QWebPage
import bs4 as bs
import urllib.request
import re
from bs4 import BeautifulSoup

class Client(QWebPage):

    def __init__(self, url):
        self.app = QApplication(sys.argv)
        QWebPage.__init__(self)
        self.loadFinished.connect(self.on_page_load)
        self.mainFrame().load(QUrl(url))
        self.app.exec_()

    def on_page_load(self):
        self.app.quit()

url = 'http://www.mackolik.com/Genis-Iddaa-Programi'
client_response = Client(url)
source = client_response.mainFrame().toHtml()
soup = bs.BeautifulSoup(source, 'html.parser')
#pattern=re.compile(r"javascript:;")
#js_test = soup.find_all('a', href='javascript')
hreff=soup.find_all("a","javascript:;")
#js_test=soup.select('a[href^="javascript:\('(.*?)'\);"]')
#print(js_test.text)
#type(href)
for i in hreff:
    print(hreff[i])

【问题讨论】:

  • 你只想解析“Gnistan”?
  • 是的。首先我要解析“Gnistan”,在同一个页面上有很多我要解析的文本,然后我当然会对其他人应用相同的方法。
  • @TylerH,您更改并概括了主题名称,这并不容易找到和找到这类问题。我相信有很多人搜索相同的东西,但从不理解诸如锚标签之类的概括性术语。在 google 上搜索“
  • @A.Kaymakci 世界上没有其他人可能需要解析您所做的确切字符串。如果有人想知道如何解析字符串,他们不会搜索“如何解析 ”,而是搜索“如何解析字符串”。面向更多人的问题更有用。
  • @TylerH 你是从软件工程师的角度来看待这个问题的,我当然尊重它,但我想告诉你也有一些像我一样的人,他们不了解所有类型技术术语,因为标签,锚标签术语等属于 HTML 和 XML 编程,打印,因为术语更通用,属于例如。 Python。如果我只对 Python 语言感兴趣,我不必了解 HTML 等。你也可以这样看待和思考。

标签: javascript html beautifulsoup pyqt4 python-3.6


【解决方案1】:

IIUC 你只需要让 BeautifulSoup 获取所有在其href 属性中具有"javascript" 的锚标记。但是,您要解析的内容似乎是使用 JavaScript 创建的,这需要使用 selenium 和像 ChromeDriver 这样的网络驱动程序。使用 BeautifulSoup 和 requests 我们可以看到您可能想要的内容不在 html 代码中,解决您的问题的逻辑是这样的:

from bs4 import BeautifulSoup
import requests
url = "http://www.mackolik.com/Genis-Iddaa-Programi"
data = requests.get(url).text
soup = BeautifulSoup(data, 'html.parser')

for tag in soup.findAll('a'):
    if "javascript" in tag['href']:
        print(tag.text)

上面的代码检查子字符串"javascript"是否是inhref属性,如果为真则打印标签的文本。

使用 selenium 和 ChromeDriver 的逻辑几乎相同,但我们需要其他方法:

from selenium import webdriver

url = "http://www.mackolik.com/Genis-Iddaa-Programi"
driver = webdriver.Chrome()
driver.get(url)

for tag in driver.find_elements_by_tag_name("a"):
    if "javascript" in tag.get_attribute("href"):
        print(tag.text)

【讨论】:

  • 谢谢@Vinicius Aguiar。它工作正常。现在我将编辑代码,然后它会以很好的形式打印出来。再次非常感谢。您的解决方案很聪明。
【解决方案2】:

你可以这样做,我知道这是在 VB 中,但你可以接受这个想法......

'look for the begining of <a href
    Dim xstr As String = "<a href=javascript:8==99999?popDuelloDialog(2754288):popTeam(2386)>Gnistan</a>"
    Dim xStart As Integer = InStr(xstr, "<a href")
    If xStart > 0 Then
        'look for the end
        Dim AHREF As Integer = InStr(xStart, xstr, ">") + 1
        'look for </a>
        Dim endAHREF As Integer = InStr(AHREF, xstr, "</a>")
        'take what you need
        Dim Result As String = Mid(xstr, AHREF, endAHREF - AHREF)


    End If

【讨论】:

  • 你在这里申请分治操作。您将锚标记分成两部分,然后彼此相减,然后找到解析后的文本。我会自己尝试这个方法。如果我能成功,我会在这里分享。
  • 没错。那么如果你想做一堆,那么只需删除字符串中“”之前的所有内容并重复循环。
最近更新 更多