2

ウェブサイトから医薬品のリストをスクレイピングしようとしています。JSOUP を使用して Html を解析しています。

これが私のコードです:

URL url = new URL("http://www.medindia.net/drug-price/index.asp?alpha=a");
Document doc1 = Jsoup.parse(url, 0);

Elements rows = doc1.getElementsByAttributeValue("style", "padding-left:5px;border-right:1px solid #A5A5A5;");

for(Element row : rows){
    String htm = row.text();
    if(!(htm.equals("View Price")||htm.contains("Show Details"))) {
        System.out.println(htm);
        System.out.println();
    }
}

これが私が得ている出力です:

出力画像

PSこれは完全な出力ではありませんが、完全な出力のスクリーンショットを撮ることができなかったので、表示しました。

私は2つのことを知る必要があります:

質問 1.各医薬品名の前に余分なスペースが表示されるのはなぜですか? また、医薬品名の後に余分な改行が表示されるのはなぜですか?

質問 2.この問題を解決するにはどうすればよいですか?

4

3 に答える 3

2

いくつかのこと:

  1. 複数のページがあるため、完全な出力ではありません。for私はあなたのためにそれを修正するループを置きます.
  2. おそらく、次を使用して出力をトリミングする必要がありますhtm.trim()
  3. newLine ( !htm.isEmpty())がある場合は、印刷しないようにする必要があります。
  4. その Web サイトには、ASCII 値 160 の奇妙な文字が含まれています。問題を解決する小さな修正を追加しました。(と.replace)

固定コードは次のとおりです。

for(char page='a'; page <= 'z'; page++) {
  String urlString = String.format("http://www.medindia.net/drug-price/index.asp?alpha=%c", page);
  URL url = new URL(urlString);
  Document doc1 = Jsoup.parse(url, 0);
  Elements rows = doc1.getElementsByAttributeValue("style", "padding-left:5px;border-right:1px solid #A5A5A5;");
  for(Element row : rows){
    String htm = row.text().replace((char) 160, ' ').trim();
    if(!(htm.equals("View Price")||htm.contains("Show Details"))&& !htm.isEmpty())
    {
      System.out.println(htm.trim());
      System.out.println();
    }
  }
}
于 2012-12-07T14:29:57.323 に答える
1

1 つのことを行います:

syso でトリム関数を使用します。System.out.println(htm.trim());

更新しました :

多くの努力の後、私はこのように80の薬すべてを解析することができました:-

URL url = new URL("http://www.medindia.net/drug-price/index.asp?alpha=a");
Document doc1 = Jsoup.parse(url, 0);
Elements rows = doc1.select("td.ta13blue");
Elements rows1 = doc1.select("td.ta13black.tbold");
int cnt=0;
for(Element row : rows){
    cnt++;
    String htm = row.text().trim();
    if(!(htm.equals("View Price")||htm.contains("Show Details") || htm.startsWith("Drug"))) {
        System.out.println(cnt+" : "+htm);
        System.out.println();
    }
}
for(Element row1 : rows1){
    cnt++;
    String htm = row1.text().trim();
    if(!(htm.equals("View Price")||htm.contains("Show Details") || htm.startsWith("Drug"))) {
        System.out.println(cnt+" : "+htm);
        System.out.println();
    }
}
于 2012-12-07T14:25:22.090 に答える
0

1)スタイルで要素を取得することは非常に危険です。

2) 代わりに FIELDS のリストである ROWS を呼び出すことはさらに危険です:)

3) ページを開くと、アンカー リンクでラップされていないアイテムの名前である「黒い名前」の後にのみ、余分な行が追加されていることがわかります。

あなたの問題は、その行の2番目のフィールドが空でも空でShow DetailsView Priceないということです...それは次のとおりです。

<td bgcolor="#FFFFDB" align="center" 
    style="padding-left:5px;border-right:1px solid #A5A5A5;">
         &nbsp;
</td>

1 スペース文字列です。次のようにコードを変更します。

for(Element row : rows){
    String htm = row.text().trim(); // <!-- This one
    if(!
         (htm.equals("View Price") 
          || htm.contains("Show Details")
          || htm.equals("&nbsp;")) // <!-- And this one
       ) {
        System.out.println(htm);
        System.out.println();
    }
}
于 2012-12-07T14:49:51.667 に答える